package structure;

/*
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author antonio
 */

/*
 *  LoaderSpatialStructure carica in memoria, usando le mappe su disco,
 *  la struttura spaziale, un hashtable in pratica.
 *  L' hash è così strutturato:
 *
 *  +-----------+------------------+
 *  |   KEY     |     VALUE        |
 *  +-----------+------------------+
 *  | nome_file | hash_probability |
 *  +-----------+------------------+
 *
 *  - 1 - "nome_file" è la mappa su disco che contiene le info spaziale di una stanza/punto
 *  - 2 - "hash_probability" è un hash che contiene le frequenze dei segnali rilevati nella
 *        stanza/punto associata
 *
 * hash_probability è così strutturato:
 *
 *  +----------------+-------------------+
 *  |   KEY          |     VALUE         |
 *  +----------------+-------------------+
 *  | valore_segnale | frequenza_segnale |
 *  +----------------+-------------------+
 *
 *  - 1 - "valore_segnale" potenza in db rilevata
 *  - 2 - "frequenza" numero di volte in cui si è rilevato quel valore di potenza
 *        durante la fase di training.
 *
 *  - ATTENZIONE - la key=100 in hash_probability contiene il numero totale di segnali
 *                 sniffati durante la fase di training. Questa info è necessaria per
 *                 il calcolo delle probabilità.
 * */

import java.util.*;
import java.io.*;
import probability.*;


public class LoaderSpatialStructure {

    private Hashtable globalStructure;
    private HashSpatialStructureHandler spatialHandler;
    private String mappaDir;

    public LoaderSpatialStructure(String mappaDir)
    {
        this.mappaDir = mappaDir;
        this.globalStructure = new Hashtable();
        this.spatialHandler = new HashSpatialStructureHandler(this.globalStructure, this.mappaDir);
    }

    public Hashtable loadStructure()
    {
        try
        {
            File dir = new File(this.mappaDir);

            if(dir.isDirectory())
            {
                String listaFile[] = dir.list();

                for(int i=0; i<listaFile.length; i++)
                {

                    String nomeFile = listaFile[i];

                    BufferedReader mappaPunto = new BufferedReader(new FileReader(this.mappaDir + nomeFile));

                    String line = mappaPunto.readLine();
                    StringTokenizer tokenizer = new StringTokenizer(line, " ");

                    Hashtable hashProbability = new Hashtable();  //hash che contiene le frequenze dei segnali della stanza

                    HashProbabilityHandler handler = new HashProbabilityHandler(hashProbability);
                    

                    int k=0;
                    while(tokenizer.hasMoreTokens() && k<101)
                    {

                        if(k==100)
                        {
                            handler.setTotalValue(tokenizer.nextToken());
                        }
                        else
                        {
                            handler.updateProbabilityValue(k, tokenizer.nextToken());
                        }
                        k++;
                    }

                    this.spatialHandler.updateSpatialStructure(listaFile[i], hashProbability);

                }

                /*
                for(int j=0; j<matrixVector.size(); j++)
                {

                    Hashtable hashProbability = new Hashtable();  //hash che contiene le frequenze dei segnali della stanza

                    //inserisco i valori dei segnali nell' hashtable

                    HashProbabilityHandler handler = new HashProbabilityHandler(hashProbability);
                    handler.initializeHash();
                    for(int n=0; n<100; n++)
                    {
                        handler.updateProbabilityValue(n, ((String[])matrixVector.elementAt(j))[n]);
                    }

                    //inserisco il valore totale dei segnali rilevati

                    handler.updateTotalValue(((String[])matrixVector.elementAt(j))[100]);

                    //inserisco l'hash delle frequenze dei segnali della stanza nel hash della strattura spaziale

                    //this.spatialHandler.updateSpatialStructure(mappaDir, hashProbability);
                }
                */
            }
            else
            {
                //lanciare l'eccezione corretta!!!
            }

        }catch(Exception e)
        {
            e.printStackTrace();
        }

        return this.globalStructure;
    }

}
